#include <REGX52.H>
#include "I2C.h"

sbit I2C_SCL = P2^1;
sbit I2C_SDA = P2^0;

void I2C_Start(void)//开始函数
{			
	I2C_SDA = 1;
	I2C_SCL = 1;//确保起始条件两个都是高电平
	I2C_SDA = 0;//先把SDA拉低
	I2C_SCL = 0;//再把SCL拉低
}	

void I2C_Stop(void)//结束函数
{
	I2C_SDA = 0;
	I2C_SCL = 1;
	I2C_SDA = 1;	
}

void I2C_SendByte(unsigned char Byte)//发送字节数据
{				
	unsigned char i;
	for(i=0;i<8;i++)
	{
		I2C_SDA = Byte & (0x80>>i);	//把Byte最高位取出，赋值给I2C_SDA,依次从高到底
		I2C_SCL = 1;				//单片机运行速度不是很快，此处不用加延时，>0.4us的
		I2C_SCL = 0;
	}
	
}

unsigned char I2C_ReceiveByte(void)//接收字节数据
{
	unsigned char i,Byte=0x00;
	
	I2C_SDA = 1;	//接收之前，先把I2C_SDA置1，释放总线
	for(i=0;i<8;i++)
	{
		I2C_SCL = 1;	//拉高SCL，SCL读取SDA
		if(I2C_SDA == 1){Byte |= (0x80>>i);}
			/*如果读取到的SDA为1，把Byte最高位置1，
			如果读取到的SDA为0，不处理，默认最高位为0
			放在循环里从高位到低位依次读取*/
		I2C_SCL = 0;	//拉低SCL，结束当前循环
	}
	return Byte;
}

void I2C_SendAck(unsigned char AckBit)//发送应答
{				//AckBit 应答位数据，只有一个位，相当于一个bit,只表示0和1的意思
	I2C_SDA = AckBit;//给应答就是0，不给应答就是1
	I2C_SCL = 1;
	I2C_SCL = 0;
}

unsigned char I2C_ReceiveAck(void)//接收应答
{
	unsigned char AckBit;
	I2C_SDA = 1;	//先释放SDA
	I2C_SCL = 1;	//高电平期间读取SDA
	AckBit=I2C_SDA;	//读取到什么，就返回什么
	I2C_SCL = 0;
	return AckBit;	//返回0，代表有应答，返回1，代表无应答
}
	